/**
 * 求指定范围内的随机整数
 * @param {number} a 表示范围的数字1
 * @param {number} b 表示范围的数字2
 * 返回一个范围内的随机数
 */
 function getRandom(a, b){
    var max = b;
    var min = a;
    if(a>b){
        max = a
        min = b
    }
    return parseInt(Math.random() * (max - min)) + min
}
/**
 * 获取随机颜色的函数
 * @param {boolean} hex 可选项，是否要16进制的颜色值
 * 返回一个随机的颜色值，可能是16进制的，也可能是rgb的
 */
function getColor(hex){
    if(hex === true){
        var color = '#';
        for(var i=1;i<=3;i++){
            var num = getRandom(0,256)
            var hexNum = num.toString(16)
            if(hexNum.length === 1){
                hexNum = '0' + hexNum
            }
            color += hexNum
        }
    }else{
        var color = 'rgb(';
        var f = '';
        for(var i=1;i<=3;i++){
            var num = getRandom(0,256)
            color += f + num
            f = ','
        }
        color += ')'
    }
    return color;
    
}
/**
 * @param {TIME} time1 时间节点1
 * @param {TIME} time2 时间节点2
 * @return {Object} 以对象形式返回时间差
 */
 function getTimeDifference(time1,time2){
    var diffTime = Math.round(Math.abs(time1.getTime()-time2.getTime()))
    var day = parseInt(diffTime / (60*60*24))
    var hours = parseInt(diffTime % (60*60*24) / (60*60))
    var minutes = parseInt(diffTime % (60*60) / 60)
    var seconds = diffTime % 60;
    return{
        day: day,
        hours: hours,
        minutes: minutes,
        seconds: seconds
    }
}


/**
 * 获取指定标签的某个样式的函数
 * @param {node} ele 要获取样式的标签元素
 * @param {string} attr 获取的css属性名
 * 返回css属性的值
 */
 function getStyle(ele, attr){
    if(window.getComputedStyle){
        return window.getComputedStyle(ele)[attr]
    }else{
        return ele.currentStyle[attr]
    }
}


/**
 * 万能的绑定事件的函数
 * @param {node} ele 标签元素对象
 * @param {string} type 事件类型
 * @param {function} handler 触发事件执行的函数
 */
function bindEvent(ele,type,handler){
    if(ele.addEventListener){
        ele.addEventListener(type,handler)
    }else if(ele.attachEvent){
        ele.attachEvent('on'+type,handler)
    }else{
        ele['on'+type] = handler
    }
}

/**
 * 运动函数
 * @param {*} ele 标签元素
 * @param {*} obj 以对象的形式传入的参数（要运动的属性和值）
 * @param {*} fn 执行函数
 */
function animate(ele, obj, fn=function(){}){
    var num = 0
    var k = 0
    for(let attr in obj){
        num++
        let target = obj[attr]
        let l = getStyle(ele, attr);
        if(attr === 'opacity'){
            l *= 100
            target *= 100
        }
        l = parseInt(l)
        let timerId = setInterval(function(){
            var speed = (target - l) / 10
            speed = speed>0?Math.ceil(speed):Math.floor(speed);
            l += speed;
            if(attr === 'opacity'){
                ele.style[attr] = l / 100
            }else{
                ele.style[attr] = l + 'px'
                // console.log(l);
            }
            if(l===target){
                l = target
                // 当当前要设置的值跟目标值相等了，设置最后一次
                // if(attr === 'opacity'){
                //     ele.style[attr] = l / 100
                // }else{
                //     ele.style[attr] = l + 'px'
                //     console.log(l);
                // }
                clearInterval(timerId)
                k++
                if(num === k){
                    fn()
                }
            }
            // 希望fn调用，是所有运动结束以后执行的函数 - 但可惜现在不是
            // 因为上面的if执行结束后，还会执行下面的代码
            // 为了保证fn是最后执行的代码 - 给上面的if添加else，将下面的代码放在else中
            
            // else{
            //     // // 如果这样做了，目标是1200，最终只会走到1199，因为上面条件成立的时候，当目标值 === 1200 的时候，当前的left值还是1199，没有设置最后一个1200
            //     // if(attr === 'opacity'){
            //     //     ele.style[attr] = l / 100
            //     // }else{
            //     //     ele.style[attr] = l + 'px'
            //     //     console.log(l);
            //     // }
            // }
        },20)
    }
}